import router from "@/router";
import { useUserStore, usePermissionStore } from "@/stores";
// import NProgress from "@/utils/nprogress";
import type{ RouteRecordRaw } from "vue-router";
import { TOKEN_KEY } from "@/enums/CacheEnum";

export function setupPermission(){
    //白名单路由
    const whiteList = ['/login'];

    router.beforeEach(async(to,from,next)=>{
        // NProgress.start();
        const hasToken = localStorage.getItem(TOKEN_KEY);
        if (hasToken) {
            if (to.path === '/login') {
                // 如果已登录,跳转首页
                next({path:'/'});
                // NProgress.done();
            }else{
                const userStore = useUserStore();
                const hasRoles = userStore.user.roles && userStore.user.roles.length >0;
                if (hasRoles) {
                    // 未匹配到任何路由就会跳转到404页面
                    if (to.matched.length === 0) {
                        from.name ? next({name:from.name}) : next("/404")
                    }else{
                        // 如果路由参数中有title,覆盖路由元信息中的title
                        const title = (to.params.title as string) || (to.query.title as string);
                        if (title) {
                            to.meta.title = title;
                        }
                        next()
                    }
                }else{
                    const permissionStore = usePermissionStore();
                    try {
                        const { roles } = await userStore.getUser();
                        const accessRoutes = await permissionStore.generateRoutes(roles);
                        accessRoutes.forEach((route: RouteRecordRaw) => {
                            router.addRoute(route);
                        });
                        next({ ...to, replace: true });
                    } catch (error) {
                        // 移除 token 并跳转登录页
                        await userStore.resetToken();
                        // 重定向到登录页，并携带当前页面路由和参数，作为登录成功后跳转的页面
                        const params = new URLSearchParams(to.query as Record<string, string>);
                        const queryString = params.toString();
                        const redirect = queryString? `${to.path}?${queryString}`: to.path;
                        next(`/login?redirect=${encodeURIComponent(redirect)}`);
                        // NProgress.done();
                    }
                }
            }
        }else{
            // 未登录
            if (whiteList.indexOf(to.path)!==-1) {
                // 在白名单,直接进入
                next()
            }else{
                // 不在白名单,重定向到登录页
                const params = new URLSearchParams(to.query as Record<string,string>);
                const queryString = params.toString();
                const redirect = queryString ? `${to.path}?${queryString}`:to.path;
                next(`/login?redirect=${encodeURIComponent(redirect)}`);
                // NProgress.done();
            }
        }
    })
}

// 是否有权限
export function hasAuth(
    value:string | string[],
    type:"button" | "role" = "button"
){
    const {roles,perms} = useUserStore().user;
    // 超级管理员|拥有所有按钮的权限
    if (type==="button" && roles.includes("ROOT")) {
        return true
    }
    const auths = type === 'button' ? perms:roles;
    return typeof value === 'string'?auths.includes(value):auths.some((perm)=>{
        return value.includes(perm)
    })
}